home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 316.adf / Life / life68.asm < prev    next >
Assembly Source File  |  1990-02-06  |  4KB  |  254 lines

  1. ;
  2. ;   Life in 68020!  Three passes.
  3. ;
  4.     public    _pass1
  5.     public    _pass2
  6.     public    _pass3
  7.     public    _pass3t
  8. ;
  9. ;   First pass:  Calculates t+(t<<1)+(t>>1) for a huge bit string.
  10. ;
  11. ;   Arguments:  long *srca, *dsta, *dstb, len
  12. ;
  13. ;      srca is the source.
  14. ;      dsta is where the low-order destination is written
  15. ;      dstb is where the high-order destination is written
  16. ;      len is the total number of longwords needed
  17. ;
  18. _pass1:
  19.     movem.l    d1/d2/d3/d4/d5/d7/a0/a1/a2,-(sp)
  20.     move.l    40(a7),a0
  21.     move.l    44(a7),a1
  22.     move.l    48(a7),a2
  23.     move.l    52(a7),d7
  24.     move.l    #0,d5
  25.     bra    pass1in
  26. in2:
  27.     swap    d7
  28. inagain:
  29.     move.l    (a0)+,d0
  30.     bne    inover
  31.     lsr.b    #1,d5
  32.     roxr.l    #1,d0
  33.     move.l    #0,d5
  34.     move.b    (a0),d3
  35.     add.b    d3,d3
  36.     addx.w    d5,d0
  37.     move.l    d0,(a1)+
  38.     move.l    d5,(a2)+
  39.     dbra    d7,inagain
  40.     swap    d7
  41.     dbra    d7,in2
  42.     bra    inov2
  43. inover:
  44.     move.l    d0,d1
  45.     move.l    d0,d2
  46.     lsr.b    #1,d5
  47.     roxr.l    #1,d1
  48.     move.l    d0,d5
  49.     move.b    (a0),d3
  50.     add.b    d3,d3
  51.     addx.l    d2,d2
  52.     move.l    d0,d3
  53.     eor.l    d1,d0
  54.     and.l    d1,d3
  55.     move.l    d2,d4
  56.     and.l    d0,d4
  57.     eor.l    d2,d0
  58.     eor.l    d4,d3
  59.     move.l    d0,(a1)+
  60.     move.l    d3,(a2)+
  61. pass1in:
  62.     dbra    d7,inagain
  63.     swap    d7
  64.     dbra    d7,in2
  65. inov2:
  66.     movem.l    (sp)+,d1/d2/d3/d4/d5/d7/a0/a1/a2
  67.     move.l    #0,d0
  68.     rts
  69. ;
  70. ;   This second pass does the main work.  It's also the main time sink.
  71. ;
  72. ;   Arguments:  long *srca, *srcb, *srcc, *dsta, mod, len
  73. ;
  74. ;      srca = main source.
  75. ;      srcb = low order source from above
  76. ;      srcc = high order source from above
  77. ;      mod = byte offset to next/previous row
  78. ;      len = number of longwords to do (again)
  79. ;
  80. _pass2:
  81.     movem.l    d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6,-(sp)
  82.     move.l    60(a7),a0
  83.     move.l    64(a7),a2
  84.     move.l    68(a7),a3
  85.     move.l    72(a7),d0
  86.     move.l    76(a7),d7
  87.     move.l    d0,d6
  88.     lea    (a2,d6.l),a4
  89.     lea    (a3,d6.l),a1
  90.     neg.l    d0
  91.     lea    (a2,d0.l),a5
  92.     lea    (a3,d0.l),a6
  93.     bra    pass2in
  94. in3:
  95.     swap    d7
  96. in4:
  97.     move.l    (a2)+,d0
  98.     move.l    d0,d1
  99.     move.l    (a5)+,d2
  100.     eor.l    d2,d0
  101.     and.l    d2,d1
  102.     move.l    (a4)+,d2
  103.     move.l    d2,d3
  104.     and.l    d0,d3
  105.     eor.l    d2,d0
  106.     or.l    d3,d1
  107.     move.l    (a1)+,d2
  108.     move.l    d2,d3
  109.     and.l    d1,d2
  110.     eor.l    d3,d1
  111.     move.l    (a6)+,d3
  112.     move.l    d3,d4
  113.     and.l    d1,d3
  114.     eor.l    d4,d1
  115.     eor.l    d3,d2
  116.     move.l    (a0),d5
  117.     beq    in4q
  118.     move.l    (a3)+,d3
  119.     move.l    d3,d4
  120.     and.l    d1,d3
  121.     eor.l    d4,d1
  122.     eor.l    d3,d2
  123.     not.l    d0
  124.     eor.l    d1,d0
  125.     eor.l    d1,d2
  126.     or.l    d5,d1
  127.     and.l    d1,d0
  128.     and.l    d2,d0
  129.     move.l    d0,(a0)+
  130. pass2in:
  131.     dbra    d7,in4
  132.     swap    d7
  133.     dbra    d7,in3
  134. out4q:
  135.     movem.l    (sp)+,d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
  136.     move.l    #0,d0
  137.     rts
  138. ;
  139. ;   A minor optimization.  If the current long-word is zero, we can make some
  140. ;   simplifications.
  141. ;
  142. in4q:
  143.     not.l    d2
  144.     and.l    d2,d0
  145.     and.l    d1,d0
  146.     move.l    d0,(a0)+
  147.     add.w    #4,a3
  148.     dbra    d7,in4
  149.     swap    d7
  150.     dbra    d7,in3
  151.     bra    out4q
  152. ;
  153. ;   Third pass.  Clears the perimeter.
  154. ;
  155. ;   Arguments:  long *dst, width, height
  156. ;
  157. ;      dst = destination (and source) to `clear'
  158. ;      width = width of screen in bytes (must be a multiple of 4)
  159. ;      height = height of screen in pixels
  160. ;
  161. _pass3:
  162.     movem.l    d1/d2/d7/a0,-(sp)
  163.     move.l    20(a7),a0
  164.     move.l    #0,d0
  165.     move.l    24(a7),d7
  166.     lsr.w    #2,d7
  167.     bra    loop5
  168. in5:
  169.     move.l    d0,(a0)+
  170. loop5:
  171.     dbra    d7,in5
  172.     sub.w    #2,a0
  173.     move.l    28(a7),d7
  174.     sub.l    #1,d7
  175.     move.l    24(a7),d2
  176.     move.l    #$fffe7fff,d1
  177.     bra    loop6
  178. in6:
  179.     and.l    d1,(a0)
  180.     add.w    d2,a0
  181. loop6:
  182.     dbra    d7,in6
  183.     sub.w    d2,a0
  184.     add.w    #2,a0
  185.     move.l    24(a7),d7
  186.     lsr.w    #2,d7
  187.     bra    loop7
  188. in7:
  189.     move.l    d0,(a0)+
  190. loop7:
  191.     dbra    d7,in7
  192.     movem.l    (sp)+,d1/d2/d7/a0
  193.     move.l    #0,d0
  194.     rts
  195. ;
  196. ;   Third pass.  Clears the perimeter, doing a torus wrap.
  197. ;
  198. ;   Arguments:  long *dst, width, height
  199. ;
  200. ;      dst = destination (and source) to `clear'
  201. ;      width = width of screen in bytes (must be a multiple of 4)
  202. ;      height = height of screen in pixels
  203. ;
  204. _pass3t:
  205.     movem.l    d1/d2/d7/a0/a1,-(sp)
  206.     move.l    24(a7),a0
  207.     move.l    #0,d0
  208.     move.l    32(a7),d2
  209.     sub.l    #2,d2
  210.     mulu.w    30(a7),d2
  211.     lea    (a0,d2.l),a1
  212.     move.l    28(a7),d7
  213.     lsr.w    #2,d7
  214.     bra    loop5t
  215. in5t:
  216.     move.l    (a1)+,(a0)+
  217. loop5t:
  218.     dbra    d7,in5t
  219.     move.l    28(a7),d7
  220.     lsr.w    #2,d7
  221.     bra    loop5u
  222. in5u:
  223.     move.l    (a0)+,(a1)+
  224. loop5u:
  225.     dbra    d7,in5u
  226.     move.l    24(a7),a0
  227.     move.l    28(a7),d0
  228.     lea    -1(a0,d0.l),a1
  229.     move.l    32(a7),d7
  230.     bra    int7t
  231. int6t:
  232.     btst    #6,(a0)
  233.     beq    fb1
  234.     or.b    #1,(a1)
  235.     btst    #1,(a1)
  236.     beq    fb2
  237. fb4:
  238.     or.b    #$80,(a0)
  239.     bra    fb3
  240. fb1:
  241.     and.b    #$fe,(a1)
  242.     btst    #1,(a1)
  243.     bne    fb4
  244. fb2:
  245.     and.b    #$7f,(a0)
  246. fb3:
  247.     add.w    d0,a0
  248.     add.w    d0,a1
  249. int7t:
  250.     dbra    d7,int6t
  251.     movem.l    (sp)+,d1/d2/d7/a0/a1
  252.     move.l    #0,d0
  253.     rts
  254.